package controller

import (
	"github.com/kataras/iris/v12"
	"github.com/spf13/cast"
	"wit-admin-go/system/app/dto"
	"wit-admin-go/system/app/service"
	"wit-admin-go/system/utils"
	log "wit-admin-go/system/zaplogger"
)

type MenuController struct{}

var Menu = new(MenuController)

// GetMenuById
//
//	@Tags		menu
//	@Summary	通过id获取菜单信息
//	@accept		x-www-form-urlencoded
//	@Produce	x-www-form-urlencoded
//	@Param		id	query	string	true	"menu id"
//	@Success	200
//	@Router		/menu/getMenuById [get]
//
// @Security ApiKeyAuth
func (us *MenuController) GetMenuById(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	menu, err := service.MenuService.GetMenuById(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = "数据没找到"
	} else {
		res.Code = iris.StatusOK
		res.Data = menu
		res.Msg = "请求成功"
	}
	_ = ctx.JSON(res)
}

// CreateMenu  添加菜单
//
//	@Summary		添加菜单
//	@Description	添加菜单
//	@Tags			menu
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			parentId	query	string	false	"上级菜单"
//	@Param			name		query	string	true	"菜单名"
//	@Param			path		query	string	true	"跳转路由"
//	@Param			component	query	string	true	"组件名"
//	@Param			mode		query	string	true	"菜单类型 A：目录 B：菜单 C：按钮"
//	@Param			sort		query	number	true	"排序"
//	@Param			icon		query	string	false	"图标"
//	@Param			disabled	query	boolean	false	"是否禁用"
//	@Param			hideTab		query	boolean	false	"不要在tab中显示"
//	@Param			affix		query	boolean	false	"是否固定在tab上"
//	@Param			memo		query	string	false	"备注"
//	@Success		200
//	@Router			/menu/createMenu [post]
//
// @Security ApiKeyAuth
func (us *MenuController) CreateMenu(ctx iris.Context) {
	res := new(dto.Result)
	menu := new(dto.Menu)
	menu.Id = utils.GetUid()
	menu.CreateId = GetUser(ctx).Id
	err := ctx.ReadForm(menu)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	err = service.MenuService.PostCreateMenu(*menu)
	if err != nil {
		res.Code = iris.StatusInternalServerError
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "创建成功"
	}
	_ = ctx.JSON(res)
}

// UpdateMenu  修改菜单
//
//	@Summary		修改菜单
//	@Description	修改菜单
//	@Tags			menu
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id			query	string	true	"ID"
//	@Param			parentId	query	string	false	"上级菜单"
//	@Param			name		query	string	false	"菜单名"
//	@Param			path		query	string	false	"跳转路由"
//	@Param			component	query	string	false	"组件名"
//	@Param			sort		query	number	false	"排序"
//	@Param			icon		query	string	false	"图标"
//	@Param			mode		query	string	false	"菜单类型 A：目录 B：菜单 C：按钮"
//	@Param			disabled	query	boolean	false	"是否禁用"
//	@Param			hideTab		query	boolean	false	"不要在tab中显示"
//	@Param			affix		query	boolean	false	"是否固定在tab上"
//	@Param			memo		query	string	false	"备注"
//	@Success		200
//	@Router			/menu/updateMenu [put]
//
// @Security ApiKeyAuth
func (us *MenuController) UpdateMenu(ctx iris.Context) {
	res := new(dto.Result)
	menu := new(dto.Menu)
	menu.UpdateId = GetUser(ctx).Id
	err := ctx.ReadForm(menu)
	if err != nil {
		log.Log.Error(cast.ToString(err))
		res.Code = iris.StatusBadRequest
		res.Msg = cast.ToString(err)
		_ = ctx.JSON(res)
		return
	}
	err = service.MenuService.PutUpdateMenu(*menu)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "修改成功"
	}
	_ = ctx.JSON(res)
}

// GetList 获取所有菜单
//
//	@Summary		获取菜单信息
//	@Description	获取菜单信息
//	@Tags			menu
//	@Param			pageNum		query	int		false	"页码"
//	@Param			pageSize	query	int		false	"每页数"
//	@Param			name		query	string	false	"菜单名"
//	@Param			path		query	string	false	"路由"
//	@Param			component	query	string	false	"组件名"
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Success		200
//	@Router			/menu/getMenuList [get]
//
// @Security ApiKeyAuth
func (us *MenuController) GetList(ctx iris.Context) {
	res := new(dto.Result)
	page := new(dto.MenuPage)
	if err := ctx.ReadForm(page); err != nil {
		res.Code = iris.StatusBadRequest
		res.Msg = "参数错误"
		_ = ctx.JSON(res)
		return
	}
	menu, total := service.MenuService.GetMenuList(page)
	res.Data = menu
	res.Msg = "请求成功"
	res.Code = iris.StatusOK
	// Header返回总条数
	utils.SetTotal(ctx, total)
	_ = ctx.JSON(res)
}

// GetTreeList 获取所有菜单树
//
//	@Summary		获取菜单树
//	@Description	获取菜单树
//	@Tags			menu
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			pageNum		query	int		false	"页码"
//	@Param			pageSize	query	int		false	"每页数"
//	@Param			name		query	string	false	"菜单名"
//	@Param			path		query	string	false	"路由"
//	@Param			component	query	string	false	"组件名"
//	@Success		200
//	@Router			/menu/getTreeList [get]
//
// @Security ApiKeyAuth
func (us *MenuController) GetTreeList(ctx iris.Context) {
	res := new(dto.Result)
	page := new(dto.MenuPage)
	if err := ctx.ReadForm(page); err != nil {
		res.Code = iris.StatusBadRequest
		res.Msg = "参数错误"
		_ = ctx.JSON(res)
		return
	}
	menu, total := service.MenuService.GetTreeList(page)
	res.Data = menu
	res.Msg = "请求成功"
	res.Code = iris.StatusOK
	// Header返回总条数
	utils.SetTotal(ctx, total)
	_ = ctx.JSON(res)
}

// DeleteMenu 删除菜单
//
//	@Summary		删除菜单
//	@Description	删除菜单
//	@Tags			menu
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id	query	string	true	"menu id"
//	@Success		200
//	@Router			/menu/deleteMenu [delete]
//
// @Security ApiKeyAuth
func (us *MenuController) DeleteMenu(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	err := service.MenuService.DelMenu(id, GetUser(ctx).Id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "删除成功"
	}
	_ = ctx.JSON(res)
}

// RemoveMenu 永久删除菜单
//
//	@Summary		永久删除菜单
//	@Description	永久删除菜单
//	@Tags			menu
//	@Accept			x-www-form-urlencoded
//	@Produce		x-www-form-urlencoded
//	@Param			id	query	string	true	"menu id"
//	@Success		200
//	@Router			/menu/removeMenu [delete]
//
// @Security ApiKeyAuth
func (us *MenuController) RemoveMenu(ctx iris.Context) {
	res := new(dto.Result)
	id := ctx.URLParam("id")
	if id == "" {
		_ = ctx.JSON(dto.NewResult(nil, iris.StatusBadRequest, "缺少参数id"))
		return
	}

	err := service.MenuService.RemoveMenu(id)
	if err != nil {
		res.Code = iris.StatusNotFound
		res.Msg = err.Error()
	} else {
		res.Code = iris.StatusOK
		res.Msg = "删除成功"
	}
	_ = ctx.JSON(res)
}
